package br.ufpb.di.ppgi.persistencia.listeners;

import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.ufpb.di.ppgi.apresentacao.SiteConfiguration;
import br.ufpb.di.ppgi.negocio.modelo.contato.EmailImpl;
import br.ufpb.di.ppgi.negocio.modelo.contato.IEmail;
import br.ufpb.di.ppgi.negocio.modelo.contato.InternetIdentity;
import br.ufpb.di.ppgi.negocio.modelo.proposta.Proposta;
import br.ufpb.di.ppgi.negocio.modelo.proposta.PropostaStatus;
import br.ufpb.di.ppgi.negocio.modelo.usuario.Usuario;
import br.ufpb.di.ppgi.util.Mailer;
import br.ufpb.di.ppgi.util.PropertiesUtil;
import br.ufpb.di.ppgi.util.vraptor.ContainerRequestScoped;


public class PropostaListener {
	private static final Logger LOGGER = LoggerFactory.getLogger(PropostaListener.class);
	
	private SiteConfiguration getConf() {
		return ContainerRequestScoped.instanceFor(SiteConfiguration.class);
	}
	
	private PropertiesUtil getProperties() {
		return ContainerRequestScoped.instanceFor(PropertiesUtil.class);
	}
	
	private HttpServletRequest getRequest() {
		return ContainerRequestScoped.instanceFor(HttpServletRequest.class);
	}
	
	@PostPersist
	public void postPersist(Proposta proposta) {
		for (Usuario usuario : proposta.getColegiados()) {
			IEmail contato = factoryEmailInforme(proposta, usuario); 
			LOGGER.info("Enviado email de informe de nova proposta para "+usuario);
			
			Mailer.getInstance().threadedSend(contato);			
		}
	}
	
	@PostUpdate
	public void postUpdate(Proposta proposta) {
		if (proposta.getStatus()  !=  PropostaStatus.PENDENTE) {
			LOGGER.info("Enviado emails de proposta homologada.");
			
			Mailer.getInstance().threadedSend(factoryEmailHomologado(proposta, getConf().getInetIdSecretario()));
			Mailer.getInstance().threadedSend(factoryEmailHomologado(proposta, getConf().getInetIdCoordenador()));
		}
	}
	
	private IEmail factoryEmailHomologado(Proposta proposta, InternetIdentity para) {
		EmailImpl email = new EmailImpl();
		
		String msg = String.format(getProperties().getString("model.email.homologacao.proposta.mensagem"),
													para.getNome(),
													proposta.getAluno()+" - "+proposta.getTitulo()+" => "+proposta.getStatus(),
													SiteConfiguration.getBase(getRequest()));
				
		email.setDe(getConf().getDe());
		email.setPara(para);
		email.setAssunto(getProperties().getString("model.email.homologacao.proposta.assunto"));
		email.setMensagemEnviada(msg);
		
		return email;
	}

	private IEmail factoryEmailInforme(Proposta proposta, Usuario usuario) {
		EmailImpl email = new EmailImpl();
		
		String msg = String.format(getProperties().getString("model.informe.proposta.mensagem"),
										usuario.getNome(),
										proposta.getAluno()+" - "+proposta.getTitulo(),
										SiteConfiguration.getBase(getRequest()));
		email.setDe(getConf().getDe());
		email.setPara(usuario.getInfoContato());
		email.setAssunto(getProperties().getString("model.informe.proposta.assunto"));
		email.setMensagemEnviada(msg);
		
		return email;
	}
	
}
